home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPFPBCD.SA < prev    next >
Text File  |  1989-08-30  |  9KB  |  195 lines

  1.          TTL       FAST FLOATING POINT FLOAT TO BCD (FFPFPBCD)
  2. ***************************************
  3. * (C) COPYRIGHT 1980 BY MOTOROLA INC. *
  4. ***************************************
  5.  
  6. *******************************************************
  7. *                   FFPFPBCD                          *
  8. *                 FLOAT TO BCD                        *
  9. *                                                     *
  10. *    INPUT:  D7 - FLOATING POINT NUMBER               *
  11. *                                                     *
  12. *    OUTPUT: SP - DECREMENTED BY 8 AND                *
  13. *                 POINTING TO THE CONVERTED           *
  14. *                 NUMBER IN BCD FORMAT AS DESCRIBED   *
  15. *                 BELOW -                             *
  16. *                                                     *
  17. *                MMMM S E S B                         *
  18. *                                                     *
  19. *        WHERE  M - FOUR BYTES OF BCD, EACH WITH TWO  *
  20. *                   DIGITS OF THE MANTISSA (8 DIGITS) *
  21. *               S - SIGN OF MANTISSA ($00 +, $FF -)   *
  22. *               E - BCD BYTE FOR TWO DIGIT EXPONENT   *
  23. *               S - SIGN OF EXPONENT ($00 +, $FF -)   *
  24. *               B - ONE BYTE BINARY 2'S COMPLEMENT    *
  25. *                   REPRESENTATION OF THE EXPONENT    *
  26. *                                                     *
  27. *        STACK OFFSET OF RESULT  MMMMSESB             *
  28. *        AFTER RETURN            00000000             *
  29. *                                01234567             *
  30. *                                                     *
  31. *                    M M M M S E S B                  *
  32. *        EXAMPLES  $1200000000030003 +120             *
  33. *                  $3141592700010001 3.14159          *
  34. *                  $12000000FF030003 -120             *
  35. *                  $10000000FF10000A -1,000,000,000   *
  36. *                  $100000000002FFFE .001 (.1E-2)     *
  37. *                    M M M M S E S B                  *
  38. *                                                     *
  39. *    CONDITION CODES:                                 *
  40. *            N - SET IF THE RESULT IS NEGATIVE        *
  41. *            Z - SET IF THE RESULT IS ZERO            *
  42. *            V - CLEARED                              *
  43. *            C - CLEARED                              *
  44. *            X - UNDEFINED                            *
  45. *                                                     *
  46. *    ALL REGISTERS ARE TRANSPARENT                    *
  47. *                                                     *
  48. *    CODE SIZE: 168 BYTES     STACK WORK: 72 BYTES    *
  49. *                                                     *
  50. *     NOTES:                                          *
  51. *       1) EVEN THOUGH EIGHT DIGITS ARE RETURNED, THE *
  52. *          PRECISION AVAILABLE IS ONLY 7.167 DIGITS.  *
  53. *          ROUNDING SHOULD BE PERFORMED WHEN LESS     *
  54. *          THAN THE FULL EIGHT DIGITS ARE ACTUALLY    *
  55. *          USED IN THE MANTISSA.                      *
  56. *       2) THE STACK IS LOWERED BY 8 BYTES BY THIS    *
  57. *          ROUTINE.  THE RETURN ADDRESS TO THE CALLER *
  58. *          IS REPLACED BY A PORTION OF THE RESULTS.   *
  59. *       3) THE BINARY BASE 10 EXPONENT IS RETURNED    *
  60. *          TO FACILITATE CONVERSIONS TO OTHER FORMATS *
  61. *                                                     *
  62. *   TIME: (8MHZ NO WAIT STATES ASSUMED)               *
  63. *        APPROXIMATELY 330 MICROSECONDS CONVERTING    *
  64. *        THE FLOAT VALUE 55.55 TO BCD.                *
  65. *                                                     *
  66. *******************************************************
  67.          PAGE
  68. FFPFPBCD IDNT      1,1  FFP FLOAT TO BCD
  69.  
  70.          XDEF      FFPFPBCD            ENTRY POINT
  71.          XREF      9:FFP10TBL,FFPCPYRT POWER OF TEN TABLE
  72.  
  73.          OPT       PCS
  74.  
  75.          SECTION   9
  76.  
  77. * STACK DEFINITION
  78. STKOLD   EQU       46        PREVIOUS CALLERS STACK POINTER
  79. STKBEXP  EQU       45        EXPONENT IN BINARY
  80. STKEXPS  EQU       44        EXPONENTS SIGN
  81. STKEXP   EQU       43        EXPONENT IN BCD
  82. STKMANS  EQU       42        MANTISSA'S SIGN
  83. STKMANT  EQU       38        MANTISSA IN BCD
  84. STKNEWRT EQU       34        NEW RETURN POSITION
  85. STKRTCC  EQU       32        RETURN CONDITION CODE
  86. STKSAVE  EQU       0         REGISTER SAVE AREA
  87.  
  88.  
  89. FFPFPBCD LEA       -4(SP),SP SET STACK TO NEW LOCATION
  90.          MOVE.L    4(SP),-(SP)   SAVE RETURN
  91.          TST.B     D7        TEST VALUE
  92.          SUBA.W   #2,A7      CLEAR SPOT FOR CCR
  93.          MOVEM.L  D0,-(SP)   PUSH D0 ON STACK
  94.          SF       D0         CLR.B D0 W/O CHANGING CCR
  95.          BNE.S    CCZ        CHECK Z BIT,BRANCH IF CLR
  96.          BSET     #6,D0      SET BIT 6 TO 1 FOR Z BIT
  97. CCZ      BCC.S    CCC        CHECK C BIT,BRANCH IF CLR
  98.          BSET     #4,D0      SET BIT 4 TO 1 FOR C BIT
  99. CCC      BVC.S    CCV        CHECK V BIT,BRANCH IF CLR
  100.          BSET     #5,D0      SET BIT 5 TO 1 FOR V BIT
  101. CCV      BPL.S    CCN        CHECK N BIT,BRANCH IF CLR
  102.          BSET     #7,D0      SET BIT 7 TO 1 FOR N BIT
  103. CCN      ROXR.B   #4,D0      ROTATE X BIT IN
  104.          AND.W    #$1F,D0    CLEAR UPPER BYTE
  105.          MOVE.W   D0,4(SP)   SAVE CCR OF RESULT ON THE STACK
  106.          MOVE.L   (SP)+,D0   RESTORE OLD D0 VALUE
  107.          MOVEM.L   D2-D7/A0/A1,-(SP)  SAVE WORK ADDRESS REGISTER
  108.  
  109. * ADJUST FOR ZERO VALUE
  110.          BNE.S     FPFNOT0   BRANCH NO ZERO INPUT
  111.          MOVE.L    #$41,D7   SETUP PSUEDO INTEGER EXPONENT
  112.  
  113. * SETUP MANTISSA'S SIGN
  114. FPFNOT0  MOVE.B    D7,D6     COPY SIGN+EXPONENT
  115.          SMI.B     STKMANS(SP) SET RESULTS SIGN
  116.  
  117. * START SEARCH FOR MAGNITUDE IN BASE 10 POWER TABLE
  118.          ADD.B     D6,D6     SIGN OUT OF PICTURE
  119.          MOVE.B    #$80,D7   SET ROUDING FACTOR FOR SEARCH
  120.          EOR.B     D7,D6     CONVERT EXPONENT TO BINARY
  121.          EXT.W     D6        EXPONENT TO WORD
  122.          ASR.W     #1,D6     BACK FROM SIGN EXTRACTMENT
  123.          MOVE.L    #1,D3     START BASE TEN COMPUTATION
  124.          LEA       FFP10TBL,A0 START AT TEN TO THE ZERO
  125.          CMP.W     (A0),D6   COMPARE TO TABLE
  126.          BLT.S     FPFMIN    BRANCH MINUS EXPONENT
  127.          BGT.S     FPFPLU    BRANCH PLUS EXPONENT
  128. FPFEQE   CMP.L     2(A0),D7  EQUAL SO COMPARE MANTISSA'S
  129.          BCC.S     FPFFND    BRANCH IF INPUT GREATER OR EQUAL THAN TABLE
  130. FPFBCK   ADD.W     #6,A0     TO NEXT LOWER ENTRY IN TABLE
  131.          SUB.W     #1,D3     DECREMENT BASE 10 EXPONENT
  132.          BRA.S     FPFFND    BRANCH POWER OF TEN FOUND
  133.  
  134. * EXPONENT IS HIGHER THAN TABLE
  135. FPFPLU   LEA       -6(A0),A0 TO NEXT HIGHER ENTRY
  136.          ADD.W     #1,D3     INCREMENT POWER OF TEN
  137.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  138.          BGT.S     FPFPLU    LOOP IF STILL GREATER
  139.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  140.          BRA.S     FPFBCK    BACK TO LOWER AND FOUND
  141.  
  142. * EXPONENT IS LOWER THAN TABLE
  143. FPFMIN   LEA       6(A0),A0  TO NEXT LOWER ENTRY
  144.          SUB.W     #1,D3     DECREMENT POWER OF TEN BY ONE
  145.          CMP.W     (A0),D6   TEST NEW MAGNITUDE
  146.          BLT.S     FPFMIN    LOOP IF STILL LESS THAN
  147.          BEQ.S     FPFEQE    BRANCH EQUAL EXPONENT
  148.  
  149. * CONVERT THE EXPONENT TO BCD
  150. FPFFND   MOVE.B    D3,STKBEXP(SP) FILL IN BINARY EXPONENT
  151.          SMI.B     STKEXPS(SP) AND SET EXPONENTS SIGN
  152.          BPL.S     FPFPEX    BRANCH IF POSITIVE
  153.          NEG.W     D3        ABSOLUTIZE
  154. FPFPEX   CLR.B     D2        CREATE A ZEROTER
  155.          ADD.B     D2,D2     CLEAR X BIT
  156.          ABCD.B    D3,D2     CONVERT TO BCD
  157.          MOVE.B    D2,STKEXP(SP) RETURN EXPONENT IN BCD
  158.  
  159. * GENERATE THE MANTISSA IN ASCII A0->TABLE  D7=BINARY MANTISSA
  160. * D5 - MANTISSA FROM TABLE       D6.W = BINARY EXPONENT
  161. * D4 - SHIFT AND DIGIT BUILDER   D2 = DBRA MANTISSA DIGIT COUNT
  162. * A1->MANTISSA STACK POSITION
  163.          MOVE.L    #7,D2     COUNT FOR EIGHT DIGITS
  164.          MOVE.L    #0,D3     ZERO BCD LONGWORD BUILD VALUE
  165.          TST.L     D7        ? ZERO TO CONVERT
  166.          BPL.S     FPFZRO    BRANCH IF SO TO NOT ROUND
  167.          TST.B     5(A0)     ? 24 BIT PRECISE IN TABLE
  168.          BNE.S     FPFNXI    BRANCH IF NO TRAILING ZEROES
  169. FPFZRO   CLR.B     D7        CLEAR ADJUSTMENT FOR .5 LSB PRECISION
  170. FPFNXI   ASL.L     #4,D3     SHIFT FOR NEXT DIGIT GENERATION
  171.          MOVE.W    D6,D4     COPY BINARY EXPONENT
  172.          SUB.W     (A0)+,D4  FIND NORMALIZATION FACTOR
  173.          MOVE.L    (A0)+,D5  LOAD MANTISSA FROM TABLE
  174.          LSR.L     D4,D5     ADJUST TO SAME EXPONENT
  175.          MOVE.L    #9,D4     START AT NINE AND COUNT DOWN
  176. FPFINC   SUB.L     D5,D7     SUBTRACT FOR ANOTHER COUNT
  177.          DBCS      D4,FPFINC DECREMENT AND BRANCH IF OVER
  178.          BCS.S     FPFNIR    BRANCH PROPER EXECUTION
  179.          CLR.B     D4        CORRECT RARE ERROR DUE TO TABLE IMPRECISION
  180. FPFNIR   ADD.L     D5,D7     MAKE UP FOR OVER SUBTRACTION
  181.          SUB.B     #9,D4     CORRECT VALUE
  182.          NEG.B     D4        TO BETWEEN 0 AND 9 BINARY
  183.          OR.B      D4,D3     INSERT AS NEXT DIGIT
  184.          DBRA      D2,FPFNXI BRANCH IF MORE DIGITS TO GO
  185.          MOVE.L    D3,STKMANT(SP) STORE MANTISSA BCD RESULT
  186.  
  187. * RETURN
  188.          MOVEM.L   (SP)+,D2-D7/A0/A1 RESTORE WORK REGISTERS
  189.          RTR       RETURN WITH PROPER CONDITION CODE
  190.  
  191.  
  192.          END
  193.  
  194.  
  195.